package FileOutput;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

/**
 * 1）创建一个测试类FileOutputStreamDemo；
 * 2）在这个类中定义一个 method_1 函数，在这个函数中创建 FileOutputStream 类的对象out，分别使用上述两种构造函数创建，并在构造函数的参数中指定目录路径D:\\test1\\1.txt；
 * 3）定义一个字节byte数组b，并存入值；
 * 4）使用字节输出流对象out调用write()函数，将字节数组中的数据写到指定的文件中；
 * 5）使用对象out调用close()函数关闭流资源；
 */
public class FileOutputStreamDemo {
    public static void main(String[] args) {
        try {
//           method_1();
//           method_2();
//            method_3();
//            method_4();
            method_5();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void method_1() throws IOException {
        FileOutputStream out = new FileOutputStream("./src/resources/abc/1.txt");
        System.out.println(out);
        byte[] b = {97, 98, 65, 66};
        out.write(b);
        //关闭输出流
        out.close();
    }

    public static void method_2() throws IOException {
        //创建输出流对象
        OutputStream out = new FileOutputStream("./src/resources/abc/1.txt");
        //定义一个字符串
        String s = "hello，锁哥";
        out.write(s.getBytes());
        out.close();
    }

    public static void method_3() throws IOException {
        // 创建输出流对象
        OutputStream out = new FileOutputStream("./src/resources/abc/1.txt");
//		OutputStream out1=new FileOutputStream("D:\\test1\\3.txt");
        //使用输出流对象调用write函数写出整数
        /*
         * 字节输出流中的write方法每调用一次，只能写出一个字节数据。
         * 如果指定的数据较大，这个时候它只会把这个数据中最低位上的1个字节数据写到文件中
         * 97  :00000000 00000000 00000000 01100001
         * 353 :00000000 00000000 00000001 01100001
         */
//		out.write(353);//a
//		out.write(97);//a
        /*
         * public void write(byte[] b,int off,int len)
         * b表示字节数组
         * off表示从下标为off开始
         * len表示写到文件中的字节个数
         */
        byte[] b = {97, 98, 65, 66};
        out.write(b, 0, 2);//写出结果是：ab
        //关闭资源
        out.close();
//		out1.write(b);
//		out.close();
//		out.write(97);//a
//		System.out.println(Integer.toBinaryString(353));
    }

    public static void method_4() throws IOException {
        //创建输出流对象
        FileOutputStream fos = new FileOutputStream("./src/resources/abc/1.txt", true);
        /*
         * 对于以上构造函数进行说明：
         * 如果第二个参数为true，那么就会在已经存在的文件中的末尾处追加数据，如果这个文件4.txt不存在
         * 那么就会创建这个文件
         * 如果第二个参数为false，那么向文件添加数据的时候就会覆盖原来的数据
         */
        //向文件中添加数据
        fos.write("你好吗".getBytes());
        fos.write("我叫黑旋风".getBytes());
        //关闭资源
        fos.close();
    }

    /*
     * 换行演示
     * 我们如果想换行可以在添加数据的末尾书写\r\n 就可以实现换行
     * 但是\r\n属于Windows系统中特有的方法，不能在其他系统中使用，也就是说不能
     * 跨平台，这样代码的扩展性就变差了
     * 解决办法：
     * 	如果我们能够根据不同的系统获取系统对应的行分隔符，那么这样代码就可以跨平台了，
     * 那么如何获得系统的的属性，行分隔符呢？
     * 通过System类，调用这个类中的函数getProperties()
     */
    public static void method_5() throws IOException {
        //创建输出流对象
        FileOutputStream fos = new FileOutputStream("./src/resources/abc/1.txt", true);
        //向文件中写入数据
        fos.write("hello 上海传智\r\n".getBytes());
        //表示获得系统中所有的属性
		/*Properties properties = System.getProperties();
		System.out.println(properties);*/
        //获得系统中的行分隔符
        String separator = System.getProperty("line.separator");
        System.out.println("当前系统的分割符：" + separator);
        //向文件中写出数据
        fos.write(("黑旋风真帅哈哈" + separator).getBytes());
        //关闭资源
        fos.close();
    }
}
